<?php
namespace Kuoqi;
/**
 * Class Behavior 关于用户行为动作的初始化信息模块
 * @package Kuoqi
 * User kuoqi
 * Datetime 2022/2/27 10:40
 * Remark 核心组键 -app动作行为
 */
use Kuoqi;

use Kuoqi\Error;

class Behavior{

    /**
     * @var null
     * User kuoqi
     * Datetime 2022/2/27 10:45
     * Remark 使用外部APP
     */
    protected $app = null;

    protected $response = null;

    /**
     * 行为初始化
     * Behavior constructor.
     * @param $app
     * @throws \ReflectionException
     */
    public function __construct($app)
    {
        try{
            $this->app = Kuoqi::$app= $app;
            $this->checkController();//检测控制器是否可用
            $this->checkActioner();//检测对象方法是否可用
            $this->response = new Response();//绑定响应模块的基础信息
        }catch(Error $err){
            $err->quit();
        }
    }

    /**
     * User kuoqi
     * Datetime 2022/2/28 11:04
     * Remark 行为解析显示
     */
    public function exec(){
        //绑定响应信息，进行输出,
        //判定当前的输出信息
        switch($this->app->getFormat()){
            case 'json':$this->response->toJson($this->app);break;
            case 'json_string':$this->response->toJsonString($this->app);break;
            case 'web':$this->response->toWeb($this->app);break;
            default:throw new Error('not any outputs with .'.$this->app->getFormat());
        }
        //将app的需要输出的信息，都要放置到response中进行输出
        $this->response->flush();//已web的行为方式输出
    }

    /**
     * User kuoqi
     * Datetime 2022/2/27 22:13
     * Remark 检测controller是否可用
     */
    public function checkController(){
        $route = $this->app->route_controller;
        //加载完成之后
        if(class_exists($route)){
            $this->app->controller = new $route();
            //判定是否有behavior,如果有，需要执行这个方式，用来进行一些自己想的初始化
            if(method_exists($this->app->controller,'behavior')){
                //动作行为方式，这个控制某些信息
                //绑定动作信息
                $this->app->bindBehavior($this->app->controller->behavior());
            }
        }else{
            throw new Error('Class['. $route .'] Non-existent');
        }
    }

    /**
     * 检测action是否可用，如果可用，则直接使用
     * @throws \ReflectionException
     * User kuoqi
     * Datetime 2022/4/28 16:35
     * Remark
     */
    public function checkActioner(){
        Error::process('检测应用方法');
        if(method_exists($this->app->controller,$this->app->actioner)){
            //动作行为方式，这个控制某些信息
            //绑定动作信息
            $reflectionMethod = new \ReflectionMethod($this->app->route_controller, $this->app->actioner);
            $this->app->bindAction($reflectionMethod->invoke($this->app->controller, array()));
        }else{
            //会自动进入到对象的call流程
            $this->app->controller->__call($this->app->actioner,[]);
            Error::process('动作不存在，进入到call流程');
        }
    }

}